// 主进程入口文件
#include "msgUtil.h"
#include <pthread.h>
#include <stdio.h>
#include <glib.h>
#include "SendConfig.h"
#include "SendHeart.h"

char* gatewayIp;
char* sn;

char* getGatewayIp()
{
    if(gatewayIp != NULL)
    {
        return gatewayIp;
    }

    GKeyFile *file = g_key_file_new();
    g_key_file_load_from_file(file,"../config/config.ini",G_KEY_FILE_NONE,NULL);
    gchar* path = g_key_file_get_string(file,"config","deviceInfoPath",NULL);


    GKeyFile *keyFile = g_key_file_new();
    g_key_file_load_from_file(keyFile,path,G_KEY_FILE_NONE,NULL);
    gatewayIp = g_key_file_get_string(keyFile,"config","gatewayIp",NULL);

    g_key_file_free(keyFile);
    g_key_file_free(file);
    return gatewayIp;
}

char* getSn()
{
    if(sn != NULL)
    {
        return sn;  // 如果之前已经获取到sn，那么久直接返回即可，没有必要再次获取
    }
    //打开文件
    //FILE* file =  fopen("/sys/class/dmi/id/product_serial","r");
    //给sn分配空间
    //sn = (gchar *)calloc(1,128);
    //读取一行数据到sn
    //fgets(sn,128,file);
    sn = "135135";
    g_print("sn=%s\n",sn);
    return sn;
}

void* recvConfigMsg(void *param)
{
    // 配置信息可能存在多次变动，且每次变动都需要重新发起请求，所以不能只执行一次
    while(1)
    {
        // 接收配置信息
        int mqId = getMsgQueue();
        if(mqId == -1)
        {
            printf("mq create fail\n");
            pthread_exit(NULL);
        }

        Message msg = {
            .type = 1
        };
        int ret = recvMsg(mqId,&msg,MSG_SIZE);
        if(ret == -1)
        {
            printf("recv data fail\n");
            pthread_exit(NULL);
        }
        printf("recv data success,type=%ld,text=%s\n",msg.type,msg.text);

        // 向网关发起配置请求
        sendConfigRequest(&gatewayIp,getSn());
    }
}

int main(int argc, char const *argv[])
{
    printf("start join mainprocess\n");
    // 接收配置信息，并向网关进行注册广告机配置信息 - 新建线程异步处理
    pthread_t tid;
    pthread_create(&tid,NULL,recvConfigMsg,NULL);


    // 向网关发起心跳请求 - 比如每隔5分钟向网关发一次请求
    while(1)
    {
        // 发送心跳请求
        char* ipTmp = getGatewayIp();
        printf("ipTmp=%s\n",ipTmp);
        if(ipTmp == NULL)
        {
            continue;
        }
        // 发送心跳请求
        sendHeartRequest(ipTmp,getSn());
        sleep(6);
    }
    return 0;
}
